package com.hspedu.innerclass;

/**
 * 演示局部内部类的使用
 */
public class LocalInnerClass {
    public static void main(String[] args) {
        Outer01 outer01 = new Outer01();
        outer01.m1();
        /*
        内部类Inner01 f1() 方法..
        n1=100
        外部类的m2()方法..
         */
        System.out.println("outer01 hashcode=" +outer01.hashCode() );
    }
}


class Outer01{ //外部类
    private int n1 = 100;
    private void m2(){
        System.out.println("外部类的m2()方法..");
    }

    private void f1(){
        System.out.println("外部类Outer01的 f1()..");
    }
    public void m1(){
        //1.局部内部类是定义在外部类的局部位置，通常在方法中
        //3.不能添加访问修饰符，但是可以使用final修饰
        //    加了final就这个类就不能被继承了
        //4.仅仅在定义它的方法或者代码块中
        class Inner01{ //局部内部类(本质上还是一个类)
            //2.可以访问外部类的私有属性，以及其他成员
            private int n1 = 800;
            public void f1(){
                //5.局部内部类可以直接访问外部类的成员 比如访问了 外部的n1，m2()
                //7.如果外部类和局部内部类的成员重名时，默认遵守就近原则，
                // 如果想要访问外部类的成员，则可以使用外部类名.this.成员去访问

                System.out.println("内部类Inner01 f1() 方法..");
                System.out.println("内部类的 n1=" + n1);
                //Outer02.this 本质就是外部类的对象，
                //即哪个对象调用了m1,Outer01.this就指向了哪个对象
                System.out.println("外部类的 n1=" + this.n1);
                System.out.println("Outer01.this hashcode=" + Outer01.this.hashCode());
                m2();
            }
        }

        //6.外部类在方法中，可以创建inner01这个对象，然后调用方法即可
        Inner01 inner01 = new Inner01();
        inner01.f1();
        f1();

        class Inner02 extends Inner01{

        }

    }
}